package com.kdgc.ibatis.sqlsession;


import com.kdgc.ibatis.config.Configuration;
import com.kdgc.ibatis.sqlsession.proxy.MapperProxy;
import com.kdgc.utils.DataSourceUtil;

import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;

/*SqlSession 的实现类*/
public class SqlSessionImpl implements SqlSession {

    private Connection connection;

    private Configuration cfg;
    public SqlSessionImpl(Configuration cfg){
        this.cfg=cfg;
        this.connection= DataSourceUtil.getConnection(cfg);
    }



    @Override
    public <T> T getMapper(Class<T> daoInterfaceClass) {

        /*jdk的动态代理  以前一直以为 是对实现接口的类 进行代理   原来直接对接口进行代理也可以
        *
        *
        * 如果没有实现接口  使用cglib 动态代理  原理是基于子类 覆盖父类的方法  进行代理*/

        return (T)Proxy.newProxyInstance(daoInterfaceClass.getClassLoader(),
                new Class[]{daoInterfaceClass},new MapperProxy(cfg.getMappers(),connection));

    }

    @Override
    public void close() {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
